package com.nio;

import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @ClassName: NIOReadingBasicSteps
 * @Author: ZhangYue26
 * @Description: NIO读取基本步骤
 * @Date: 2021-03-11
 */
public class NIOReadingBasicSteps {
    public static void main(String[] args) throws Exception{

        RandomAccessFile aFile = new RandomAccessFile("C:\\Users\\zhangyue26\\Desktop\\备份\\application.properties", "rw");
        FileChannel inChannel = aFile.getChannel();
        //创建capacity 空间 48B的缓冲区   position和limit的含义取决于Buffer处在读模式还是写模式
        //当你写数据到Buffer中时,position表示当前的位置    limit 在写模式下，Buffer的limit表示你最多能往Buffer里写多少数据。
        // 写模式下，limit等于Buffer的capacity  当切换Buffer到读模式时， limit表示你最多能读到多少数据
        ByteBuffer buf = ByteBuffer.allocate(48);
        int bytesRead = inChannel.read(buf); //将数据读取至缓冲区
        while (bytesRead != -1) {
            buf.flip();  //flip方法将Buffer从写模式切换到读模式。调用flip()方法会将position设回0，并将limit设置成之前position的值。
            //换句话说，position现在用于标记读的位置，limit表示之前写进了多少个byte、char等 —— 现在能读取多少个byte、char等。
            while(buf.hasRemaining()){
                System.out.print((char) buf.get()); //输出数据
            }
            buf.clear(); //清空缓冲区
            bytesRead = inChannel.read(buf);
        }
        aFile.close();
    }

    /*
        通过调用Buffer.mark()方法，可以标记Buffer中的一个特定position。之后可以通过调用Buffer.reset()方法恢复到这个position
        可以使用equals()和compareTo()方法比较两个Buffer
        Buffer.rewind()将position设回0，所以你可以重读Buffer中的所有数据。limit保持不变，仍然表示能从Buffer中读取多少个元素（byte、char等）。

     */


}
